;======================================================================
;文件头
NES_16KB_PRG_SIZE           =   8   ;16KB PRG大小数量
NES_8KB_CHR_SIZE            =   0   ;8KB CHR大小数量
BANK_DATA_MASK              =   NES_16KB_PRG_SIZE * 2 - 1     ;bank号掩码
;======================================================================
PRG_DATA_BANK_C000          =   NES_16KB_PRG_SIZE * 2 - 2
PRG_DATA_BANK_E000          =   NES_16KB_PRG_SIZE * 2 - 1
MAPPER_MIRRORING            =   1       ;命名表镜像 0水平 1垂直
;======================================================================
RESET_BANK                  =   NES_16KB_PRG_SIZE * 2 - 1
RESET_ADDR                  =   $F000   ;主程序起始地址
;======================================================================
MUSIN_DATA_BANK             =   $00
CUSTOM_DATA_BANK            =   $03         ;自定义数据放置 bank 号
CUSTOM_DATA_ADDR            =   $A000       ;自定义数据地址
MENU_DATA_BANK              =   NES_16KB_PRG_SIZE * 2 - 3
MENU_DATA_ADDR              =   $8000   ;主程序起始地址
;======================================================================
    .INCLUDE "fc_menu_mapper.asm"
;======================================================================
 .INESPRG NES_16KB_PRG_SIZE                              ;16KB PRG 数量
 .INESCHR NES_8KB_CHR_SIZE                                ;8KB CHR 数量
 .INESMAP MAPPER_NUMBER                                       ;mapper号
 .INESMIR MAPPER_MIRRORING                      ;命名表镜像 0水平 1垂直
 
 .IF 0 == NES_8KB_CHR_SIZE
    .INESCHRRAM 9
 .ENDIF
 
;======================================================================
BACKGROUND_PATTERN_TABLE    =   0           ;背景图案表(0: $0000; 1: $1000)
SPRITE_PATTERN_TABLE        =   1           ;精灵图案表(0: $0000; 1: $1000)
;======================================================================
MULTICART_TYPE              =   1       ;合卡类型 0: None 1: Coolboy 2: Coolgirl
MENU_THEME                  =   1       ;菜单主题 0: None 1: Contra 2: Rockman3
;======================================================================
;内存配置
Use_Ram_Begin               =   $40     ;菜单程序占用的内存起始地址
Use_PPU_Buffer              =   $0300   ;PPU缓冲占用的内存起始地址
OAM_DMA_Buffer              =   $0400   ;精灵缓冲地址

;======================================================================
 .RSSET Use_Ram_Begin

;==================================================
;静态文本写入控制常量
STATIC_TEXT_VERTIVAL        =   $80     ;静态文本纵向显示
STATIC_TEXT_CENTER          =   $40     ;静态文本居中显示
;==================================================
FC_Data_Index_L             .RS 1       ;数据索引低位
FC_Data_Index_H             .RS 1       ;数据索引高位
FC_Data_Addr_L              .RS 1       ;数据地址低位
FC_Data_Addr_H              .RS 1       ;数据地址高位
FC_Data_Temp_L              .RS 1       ;数据临时低位
FC_Data_Temp_H              .RS 1       ;数据临时高位
FC_Data_Count               .RS 1       ;数据计数用
FC_Data_Temp                .RS 1       ;数据计数用
FC_Data_Char_Index          .RS 1       ;
FC_Bank_Bak_8000            .RS 1       ;bank号备份8000
FC_Bank_Bak_A000            .RS 1       ;bank号备份A000

;==================================================
;按键配置
FC_Gamepad_Keep             .RS 2       ;长按状态
FC_Gamepad_Once             .RS 2       ;单次按下
FC_Gamepad_Temp             .RS 2       ;按键缓冲
FC_Gamepad_Buf              .RS 2       ;按键缓冲
FC_Gamepad_Status           .RS 2       ;按键读取状态
FC_Gamepad_Ready_Turbo      .RS 2       ;按键按住连发
;手柄按键常量
JOY_KEY_UP                  =   $08     ;上
JOY_KEY_DOWN                =   $04     ;下
JOY_KEY_LEFT                =   $02     ;左
JOY_KEY_RIGHT               =   $01     ;右
JOY_KEY_SELECT              =   $20     ;选择
JOY_KEY_START               =   $10     ;开始
JOY_KEY_B                   =   $40     ;B
JOY_KEY_A                   =   $80     ;A
;长按连发设置常量
JOY_TURBO_TIME              =   $20     ;触发连按阈值
JOY_TURBO_INTERVAL          =   $08     ;连发间隔时间, 越短越快

;==================================================
;翻页配置
FC_Page_Last_Index          .RS 1       ;上次页面索引
FC_Page_Cur_Index           .RS 1       ;当前页面索引
FC_Page_Item_Index          .RS 1       ;当前页的节目索引(当前页的第几个节目)
FC_Item_Index               .RS 1       ;当前节目索引
FC_Item_Index_L             =  FC_Item_Index      ;当前节目索引
FC_Item_Index_H             .RS 1       ;当前节目索引

 .RSSET Use_PPU_Buffer
;==================================================
TASK_ITEM_SELECT_ENABLE     =   $80     ;启用输入
TASK_CHR_UPDATE_ENABLE      =   $40     ;启用CHR更新
TASK_PAL_UPDATE_ENABLE      =   $20     ;启用调色板更新
TASK_PAL_FADING_ENABLE      =   $10     ;调色板正在渐变中
TASK_PAGING_ENABLE          =   $08     ;菜单正在更新中
TASK_CURSOR_ENABLE          =   $04     ;启用光标显示
TASK_START_READY            =   $02     ;进入游戏就绪
;==================================================
;PPU配置
FC_PPU_Buf_Addr             .RS $C0     ;PPU数据缓冲地址
FC_PPU_Pal_Addr             .RS $20     ;PPU调色板缓冲地址
FC_PPU_Bkg_Pal_Addr         = FC_PPU_Pal_Addr     ;背景调色板缓冲地址
FC_PPU_Sp_Pal_Addr          = FC_PPU_Bkg_Pal_Addr + $10     ;精灵调色板缓冲地址
FC_CHR_Buf_Addr             .RS $06     ;CHR缓冲
FC_PPU_Mask_Buf             .RS 1       ;PPU显示掩码缓冲
FC_PPU_Buf_Count            .RS 1       ;PPU数据缓冲待处理数据量
FC_PPU_Item_Count           .RS 1       ;PPU处理任务条目数
FC_Wait_Time_Delay          .RS 1       ;等待时长(等待期间禁用手柄输入)
FC_Bkg_Pal_Index            .RS 1       ;背景调色板索引
FC_Sp_Pal_Index             .RS 1       ;精灵调色板索引
FC_Chr_Index                .RS 1       ;CHR更新索引
FC_Bkg_Pal_Time             .RS 1       ;背景调色板更新延时
FC_Sp_Pal_Time              .RS 1       ;精灵调色板更新延时
FC_Chr_Time                 .RS 1       ;CHR更新延时
FC_Nmi_Task_Flags           .RS 1       ;PPU处理任务状态
;==================================================
;小写字符转大写字符宏
CONVERT_TO_UPPERCASE .MACRO
    ;当字符 >= 'a' 并且 <= 'z' 时转换为大写 
    CMP #'a'
    BCC .Convert_End
    CMP #'z'
    BEQ .Convert_Char
    BCS .Convert_End
 ;转大写, 翻转 D5 位即可
.Convert_Char
    EOR #$20
.Convert_End
    .ENDM
